# -*- coding: utf-8 -*-
from application import app, db
from flask import request, redirect,g
from common.models.User import User
from common.libs.user.UserService import UserService
from common.libs.UrlManager import UrlManager
from common.libs.LogService import LogService
import re


@app.before_request
def before_request():
    path = request.path

    # 全局变量过滤的url
    ignore_urls = app.config['IGNORE_URLS']
    ignore_check_login_urls = app.config['IGNORE_CHECK_LOGIN_URLS']

    # 如果是静态的文件就不查询用户信息
    # 排除static的文件(js|html|css) 和图标文件ico
    pattern = re.compile('%s' % "|".join(ignore_check_login_urls))
    if pattern.match(path):
        return

    # 排除login登陆界面
    pattern = re.compile('%s' % "|".join(ignore_urls))
    if pattern.match(path):
        return

    user_info = check_login()

    g.current_user = None
    if user_info:
        g.current_user = user_info

    # 加入访问日志
    LogService.addAccessLog()
    pattern = re.compile('%s' % "|".join(ignore_urls))
    if pattern.match(path):
        return

    # 如果没有这个用户，则重定向至首页
    if not user_info:
        return redirect(UrlManager.buildUrl("/user/login"))

    return


'''

判断用户是否已登录

'''


def check_login():
    cookies = request.cookies
    auth_cookie = cookies[app.config['AUTH_COOKIE_NAME']] if app.config['AUTH_COOKIE_NAME'] in cookies else ''

    # 打印cookie查看明细，可以跟踪debug
    app.logger.info(auth_cookie)
    if auth_cookie is None:
        return False

    # cookie用#分开去做判断
    auth_info = auth_cookie.split("#")
    if len(auth_info) != 2:
        return False
    try:
        user_info = User.query.filter_by(uid=auth_info[1]).first()
    except Exception:
        return False

    # 如果不存在这个用户的话，则返回错误
    if user_info is None:
        return False

    # 如果不存在这个cookie,就返回错误
    if auth_info[0] != UserService.geneAuthCode(user_info):
        return False

    # 优化！！ 如果修改了密码，在已登录的界面需要立即退出
    if user_info.status != 1:
        return False

    return user_info